package hr.fer.zpr.nmbp.project3.dao.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;

import hr.fer.zpr.nmbp.project3.dao.DAOFactory;
import hr.fer.zpr.nmbp.project3.dao.LijecnikDAO;
import hr.fer.zpr.nmbp.project3.model.Bolest;
import hr.fer.zpr.nmbp.project3.model.Bolnica;
import hr.fer.zpr.nmbp.project3.model.Dijagnoza;
import hr.fer.zpr.nmbp.project3.model.Karton;
import hr.fer.zpr.nmbp.project3.model.Lijecnik;
import hr.fer.zpr.nmbp.project3.model.Pacijent;

import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ObjectFromXMLGen {

	public static Object createInstance(Node node) {
		if (node == null)
			return null;

		if (node.getNodeName().equals("bolnica")) {
			return createBolnica(node);
		} else if (node.getNodeName().equals("lijecnik")) {
			return createLijecnik(node);
		} else if (node.getNodeName().equals("pacijent")) {
			return createPacijent(node, true);
		} else if (node.getNodeName().equals("bolest")) {
			return createBolest(node);
		} else if (node.getNodeName().equals("dijagnoza")) {
			return createDijagnoza(node);
		} else {
			return null;
		}
	}

	private static Bolnica createBolnica(Node node) {
		Bolnica newBolnica = new Bolnica();

		newBolnica.setSifra(Integer.parseInt(node.getChildNodes().item(0)
				.getNodeValue()));
		newBolnica.setAdresa(node.getChildNodes().item(1).getNodeValue());
		newBolnica.setNaziv(node.getChildNodes().item(2).getNodeValue());

		return newBolnica;
	}

	private static Lijecnik createLijecnik(Node node) {
		Lijecnik newLijecnik = new Lijecnik();

		newLijecnik.setSifra(Integer.parseInt(node.getChildNodes().item(1)
				.getNodeValue()));
		newLijecnik.setIme(node.getChildNodes().item(2).getNodeValue());
		newLijecnik.setPrezime(node.getChildNodes().item(3).getNodeValue());

		// Učitavanje reference
		int sifraBolnica = Integer.parseInt(node.getChildNodes().item(0)
				.getNodeValue());
		if (sifraBolnica != 0) {
			Bolnica proto = new Bolnica();
			proto.setSifra(sifraBolnica);
			List<Bolnica> bolnice = DAOFactory.getBolnicaDAO().load(proto);
			if (bolnice.size() > 0) {
				newLijecnik.setBolnica(bolnice.get(0));
			}
		}

		return newLijecnik;
	}

	private static Pacijent createPacijent(Node node, boolean recursive) {
		Pacijent pacijent = new Pacijent();

		LijecnikDAO lijecnikDAO = DAOFactory.getLijecnikDAO();
		Lijecnik lijecnikPrototype = new Lijecnik();
		lijecnikPrototype.setSifra(Integer.parseInt(node.getAttributes()
				.item(0).getNodeValue()));
		List<Lijecnik> lijecnici = lijecnikDAO.load(lijecnikPrototype);
		if ((lijecnici != null) && (!lijecnici.isEmpty())) {
			Lijecnik lijecnik = lijecnikDAO.load(lijecnikPrototype).get(0);
			pacijent.setLijecnik(lijecnik);
		}
		pacijent.setMbo(Integer.parseInt(node.getAttributes().item(1)
				.getNodeValue()));

		pacijent.setIme(node.getChildNodes().item(2).getNodeValue());
		pacijent.setPrezime(node.getChildNodes().item(3).getNodeValue());

		if (recursive) {
			Node kartonNode = node.getChildNodes().item(4);
			Karton karton = ObjectFromXMLGen.createKarton(kartonNode, recursive, pacijent);
			pacijent.setKarton(karton);
		}
		return pacijent;
	}

	private static Bolest createBolest(Node node) {
		Bolest bolest = new Bolest();

		bolest.setSifra(Integer.parseInt(node.getAttributes().item(0)
				.getNodeValue()));
		bolest.setNaziv(node.getChildNodes().item(1).getNodeValue());
		bolest.setOpis(node.getChildNodes().item(2).getNodeValue());

		return bolest;
	}

	private static Karton createKarton(Node node, boolean recursive, Pacijent pacijent) {

		Karton karton = new Karton();

		SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd");
		try {
			karton.setDatumRodenja(dateFormater.parse(node.getChildNodes()
					.item(0).getNodeValue()));
		} catch (DOMException e) {
			karton.setDatumRodenja(null);
			e.printStackTrace();
		} catch (ParseException e) {
			karton.setDatumRodenja(null);
			e.printStackTrace();
		}

		NodeList childs = node.getChildNodes();
		for (int i = 0; i < childs.getLength(); i++) {
			if (childs.item(i).getNodeName().equals("dijagnoza") && recursive) {
				karton.getDijagnoze().add(
						ObjectFromXMLGen.createDijagnoza(childs.item(i)));
			}			
			if (childs.item(i).getNodeName().equals("kilaza")) {
				karton.setKilaza(Integer
						.parseInt(childs.item(i).getNodeValue()));
			}
			if (childs.item(i).getNodeName().equals("krvnaGrupa")) {
				karton.setKrvnaGrupa(Integer.parseInt(childs.item(i)
						.getNodeValue()));
			}
			if (childs.item(i).getNodeName().equals("napomena")) {
				karton.setNapomena(childs.item(i).getNodeValue());
			}
			if (childs.item(i).getNodeName().equals("spol")) {
				karton.setSpol(Integer.parseInt(childs.item(i).getNodeValue()));
			}
		}

		if (recursive) {
			karton.setPacijent(pacijent);
		}
		
		return karton;
	}

	private static Dijagnoza createDijagnoza(Node node) {
		Dijagnoza dijagnoza = new Dijagnoza();

		SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd");

		dijagnoza.setSifra(Integer.parseInt(node.getAttributes().item(0).getNodeValue()));

		dijagnoza.setKarton(ObjectFromXMLGen.createKarton(node.getParentNode(), false, null));
		dijagnoza.getKarton().setPacijent(ObjectFromXMLGen.createPacijent(node.getParentNode().getParentNode(), false));
		
		try {
			dijagnoza.setDatum(dateFormater.parse(node.getChildNodes().item(1).getNodeValue()));
		} catch (DOMException e) {
			dijagnoza.setDatum(null);
			e.printStackTrace();
		} catch (ParseException e) {
			dijagnoza.setDatum(null);
			e.printStackTrace();
		}

		dijagnoza.setOpis(node.getChildNodes().item(2).getNodeValue());

		return dijagnoza;
	}
}
